package com.zj.docker.service;

import com.google.common.collect.ImmutableSet;
import com.spotify.docker.client.exceptions.DockerException;
import com.zj.docker.component.DockerComponent;
import com.zj.docker.domain.ImagesInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;

import java.io.InputStream;
import java.util.List;

/**
 * @Auther: zj
 * @Date: 2018/12/3 16:41
 * @Description:
 */
public interface ImagesInfoService {


    /**
     * 保存或更新
     * @param imagesInfo
     */
    ImagesInfo SaveOrUpdate(ImagesInfo imagesInfo);

    /**
     * 新建一个image记录
     * @param imageId
     * @param fullName
     * @param name
     * @param tag
     * @param description
     * @param instructions
     * @param size
     * @param type
     * @param authorName
     * @param hasOpen
     * @param virtualSize
     * @param labels
     * @param cmd
     * @param createDate
     * @param updateDate
     * @return
     */
    ImagesInfo createNewImage(String imageId, String fullName, String name, String tag,
                      String description, String instructions, Long size,
                      Integer type, String authorName, Integer hasOpen,
                      Long virtualSize, String labels, String cmd,
                      String createDate, String updateDate);

    /**
     * 通过fullName来查找imagesInfo
     * @param fullName
     * @return
     */
    ImagesInfo findImagesInfoByFullName(String fullName);

    /**
     * 创建镜像，通过导入压缩包的形式
     * @param fullName
     * @param stream
     */
    ImagesInfo createImageByImport(String fullName, InputStream stream,String description, String instructions, Integer type,
                             String authorName, Integer hasOpen, String createDate, String updateDate ) throws DockerException, InterruptedException;

    /**
     * 从数据库，查找所有的镜像
     * @return
     */
    List<ImagesInfo> listAllImagesFromDataBase();

    /**
     * 删除指定的镜像
     * @param imageId
     */
    void deleteTheImage(String imageId);

    /**
     * 列出所有对外开放的镜像
     * @param hasOpen
     * @return
     */
    List<ImagesInfo> listImagesByHasOpen(Integer hasOpen);

    /**
     * 列出所有对外开放的镜像,分页
     * @param hasOpen
     * @param pageIndex
     * @return
     */
    Page<ImagesInfo> listImagesByHasOpenWithPage(Integer hasOpen, Integer pageIndex);

    /**
     * 列出当前用户上传的镜像
     * @param authorName
     * @return
     */
    List<ImagesInfo> listSelfImages(String authorName);

    /**
     * 列出当前用户上传的镜像,分页
     * @param authorName
     * @param pageIndex
     * @return
     */
    Page<ImagesInfo> listSelfImagesWithPage(String authorName, Integer pageIndex);

    /**
     * 获取一个镜像的所有暴露接口
     * @param imageId
     * @return
     */
    ImmutableSet<String> listExportPorts(String imageId);

    void imagePull(String fullName,String sessionId,String date);



    //测试
    void task1();

    void task2() throws InterruptedException;

    void task3();
}
